import { defineStore } from 'pinia'
import { computed, ref } from 'vue'
import { useUserStore } from '@/stores'
import { addCartListAPI, getCartListAPI, deleteCartListAPI, updateCartAPI } from '@/apis/cart'
import { ElMessage } from 'element-plus'

export const useCartStore = defineStore(
  'cart',
  () => {
    // 获取用户信息
    const userStore = useUserStore()
    const isLogin = computed(() => userStore.userInfo.token)

    // 定义state
    const cartList = ref([])
    const total = ref(0) // 总条数
    const pages = ref(0) // 总页数

    // 同步服务器购物车数据
    const updateCartList = async (pageNo = 1, pageSize = 10) => {
      if (!isLogin.value) return

      try {
        const res = await getCartListAPI(pageNo, pageSize)
        // 关键修改：适配实际接口返回结构（res.data.data而非res.result）
        const records = res.data?.records || []

        // 规范化后端返回结构，方便前端统一使用
        cartList.value = records.map((item) => {
          const good = item.good || {}
          return {
            ...item,
            goodId: item.goodId,
            // 本地使用的统一字段
            count: item.qty,
            price: good.price,
            name: good.name,
            pic: good.pic,
            // 补充：后端可能用checked字段而非selected
            selected: item.checked !== undefined ? item.checked === 1 : true,
          }
        })
        total.value = res.data?.data?.total || 0
        pages.value = res.data?.data?.pages || 0
      } catch (error) {
        console.error('获取购物车数据失败:', error)
        ElMessage.error('获取购物车数据失败')
      }
    }

    // 添加购物车
    const addCart = async (goods) => {
      if (!isLogin.value) {
        throw new Error('请先登录后再添加商品到购物车')
      }

      try {
        // 构建符合后端API要求的参数
        const cartData = {
          goodId: goods.id || goods.goodId,  // 商品ID
          qty: goods.count || goods.qty || 1  // 数量
        }

        await addCartListAPI(cartData)
        await updateCartList() // 重新获取购物车数据
        return true
      } catch (error) {
        console.error('添加购物车失败:', error)
        throw new Error(error.response?.data?.message || '添加购物车失败')
      }
    }

    // 删除购物车商品
    const deleteCart = async (id) => {
      if (!isLogin.value) {
        throw new Error('请先登录后再操作购物车')
      }

      try {
        await deleteCartListAPI([id])
        await updateCartList() // 重新获取购物车数据
      } catch (error) {
        console.error('删除购物车商品失败:', error)
        throw new Error(error.response?.data?.message || '删除购物车商品失败')
      }
    }

    // 更新购物车商品（数量或选中状态）
    const updateCart = async (cart) => {
      if (!isLogin.value) {
        throw new Error('请先登录后再操作购物车')
      }

      try {
        // 补充：支持更新选中状态
        const payload = {
          id: cart.id,
          qty: cart.qty ?? cart.count,
          checked: cart.selected ? 1 : 0  // 转换为后端需要的1/0格式
        }
        await updateCartAPI(payload)

        // 本地同步更新
        const index = cartList.value.findIndex(item => item.id === cart.id)
        if (index !== -1) {
          cartList.value[index] = {
            ...cartList.value[index],
            qty: payload.qty,
            count: payload.qty,
            checked: payload.checked,
            selected: payload.checked === 1
          }
        }
      } catch (error) {
        console.error('更新购物车商品失败:', error)
        throw new Error(error.response?.data?.message || '更新购物车商品失败')
      }
    }

    // 改变商品数量
    const changeCount = async (id, count) => {
      if (count < 1) {
        ElMessage.warning('商品数量不能少于1件')
        return
      }

      // 先更新本地状态
      const item = cartList.value.find(item => item.id === id)
      if (item) {
        item.count = count
        item.qty = count
      }

      // 再同步到服务器
      try {
        await updateCart({ id, qty: count, selected: item?.selected })
      } catch (error) {
        // 同步失败时回滚本地状态
        await updateCartList()
        ElMessage.error(error.message)
      }
    }

    // 单选功能 - 同步到服务器
    const singleCheck = async (id, selected) => {
      // 先更新本地状态
      const item = cartList.value.find(item => item.id === id)
      if (item) {
        item.selected = selected
      }

      // 同步到服务器
      try {
        await updateCart({ id, selected, qty: item?.qty })
      } catch (error) {
        await updateCartList()
        ElMessage.error(error.message)
      }
    }

    // 全选功能 - 同步到服务器
    const allCheck = async (selected) => {
      // 先更新本地状态
      cartList.value.forEach(item => {
        item.selected = selected
      })

      // 同步到服务器（使用全选接口）
      try {
        await updateCart({ id: null, checked: selected ? 1 : 0 })
      } catch (error) {
        await updateCartList()
        ElMessage.error(error.message)
      }
    }

    // 计算属性 - 总数量
    const allCount = computed(() => {
      return cartList.value.reduce((sum, item) => sum + (item.qty || item.count || 0), 0)
    })

    // 计算属性 - 总价
    const allPrice = computed(() => {
      return cartList.value.reduce(
        (sum, item) => sum + (item.qty || item.count || 0) * (item.price || item.goodsPrice || 0),
        0
      )
    })

    // 计算属性 - 是否全选
    const isAll = computed(() => {
      return cartList.value.length > 0 && cartList.value.every(item => item.selected)
    })

    // 计算属性 - 勾选数量
    const selectedCount = computed(() => {
      return cartList.value
        .filter(item => item.selected)
        .reduce((sum, item) => sum + (item.qty || item.count || 0), 0)
    })

    // 计算属性 - 勾选总价
    const selectedPrice = computed(() => {
      return cartList.value
        .filter(item => item.selected)
        .reduce((sum, item) => sum + (item.qty || item.count || 0) * (item.price || item.goodsPrice || 0), 0)
    })

    // 清空购物车
    const clearCart = () => {
      cartList.value = []
      total.value = 0
      pages.value = 0
    }

    // 初始化购物车数据（登录后调用）
    const initCart = async () => {
      if (isLogin.value) {
        await updateCartList()
      } else {
        clearCart()
      }
    }

    return {
      addCart,
      cartList,
      total,
      pages,
      deleteCart,
      updateCart,
      allCount,
      allPrice,
      singleCheck,
      allCheck,
      isAll,
      selectedCount,
      selectedPrice,
      changeCount,
      clearCart,
      updateCartList,
      initCart
    }
  }
)